Android FAQs
Android FAQs
Android
Android FAQs
Answers to common questions can be found in the following topic areas:
General questions about Android
Overview questions about developing apps on Android
Common Tasks and How To Do Them
Frequently performed tasks in developing Android applications
Troubleshooting Tips
Answers to troubleshooting common problems
Open Source Licensing
Common topics around licensing and Android Open Source
Application Framework
Common questions about the Android Application Framework
Security
Answers to common security questions
[Link] [Link]
General Android
Android
General Android
What languages does Android support?
Can I write code for Android using C/C++?
Will Android run on <insert phone here>?
I live in insert country here. Am I eligible for the Android Developers Challenge?
I live in insert country here. Am I eligible for the Android Developers Challenge?
Please see: [Link] and [Link] for more details about
the Android Developers Challenge.
[Link] [Link]
Android Howto
Android
The ApiDemos sample application includes many, many examples of common tasks and UI features. See the code inside
samples/ApiDemos and the other sample applications under the samples/ folder in the SDK.
It is still a good idea to know what is going on though. Take a look at Overview of an Android Application to understand the
basics of how an Android application works.
It is also recommended that you take a look at the ApiDemos application and the other sample applications in the samples/
folder in the SDK.
Finally, a great way to started with Android development in Eclipse is to follow both the Hello Android and Notepad code
tutorials. In particular, the start of the Hello Android tutorial is an excellent introduction to creating a new Android application in
Eclipse.
[Link] [Link]
Android Howto
Android Application to understand the basics of how an Android application works. You might also want to look at the sample
applications that ship with Android under the samples/ directory.
Alternatively, if you want to include third party JARs with your package, create a new directory for them within your project
and select Add Library... instead.
Floating or full?
When you open a new screen you can decide whether to make it transparent or floating, or full-screen. The choice of new
screen affects the event sequence of events in the old screen (if the new screen obscures the old screen, a different series of
events is called in the old screen). See Lifetime of an Activity for details.
[Link] [Link]
Android Howto
Set the Theme_Dialog theme attribute to @android:style/[Link] in your [Link] file. For example:
Calling startActivity() or startActivityForResult() will open a new screen in whatever way it defines itself (if it uses a floating
theme it will be floating, otherwise it will be full screen).
Opening a Screen
When you want to open a new screen, you can either explicitly specify the activity class to open, or you can let the operating
system decide which screen to open, based upon the data and various parameters you pass in. A screen is opened by calling
startActivity and passing in an Intent object, which specifies the criteria for the handling screen. To specify a specific screen,
call [Link] or setClassName with the exact activity class to open. Otherwise, set a variety of values and data, and let
Android decide which screen is appropriate to open. Android will find one or zero Activities that match the specified
requirements; it will never open multiple activities for a single request. More information on Intents and how Android resolves
them to a specific class is given in the Intent topic.
The next snippet requests that a Web page be opened by specifying the VIEW action, and a URI data string starting with
"[Link] schema:
Here is the intent filter from the [Link] file for [Link]:
<intent-filter>
<action android:name="[Link]" />
<category android:name="[Link]" />
<scheme android:name="http" />
<scheme android:name="https" />
<scheme android:name="file" />
</intent-filter>
Android defines a number of standard values, for instance the action constants defined by Intent. You can define custom
values, but both the caller and handler must use them. See the <intent-filter> tag description in [Link] File
Details for more information on the manifest syntax for the handling application.
[Link] [Link]
Android Howto
// Class SentResult
// Temporary screen to let the user choose something.
private OnClickListener mLincolnListener = new OnClickListener(){
public void onClick(View v) {
Bundle stats = new Bundle();
[Link]("height","6\'4\"");
[Link]("weight", "190 lbs");
[Link]("reach", "74\"");
setResult(RESULT_OK, "Lincoln", stats);
finish();
}
};
[Link] [Link]
Android Howto
The listening classes, called broadcast receivers, extend BroadcastReceiver. If you want Android to instantiate the object
whenever an appropriate intent notification is sent, define the receiver with a <receiver> element in the [Link]
file. If the caller is expected to instantiate the object in preparation to receive a message, this is not required. The receiver will
get a call to their [Link]() method. A receiver can define an <intent-filter> tag that describes the
types of messages it will receive. Just as Android's IntentResolver will look for appropriate Activity matches for a startActivity()
call, it will look for any matching Receivers (but it will send the message to all matching receiver, not the "best" match).
To send a notification, the caller creates an Intent object and calls [Link]() with that Intent. Multiple recipients
can receive the same message. You can broadcast an Intent message to an intent receiver in any application, not only your
own. If the receiving class is not registered using <receiver> in its manifest, you can dynamically instantiate and register a
receiver by calling [Link]().
Receivers can include intent filters to specify what kinds of intents they are listening for. Alternatively, if you expect a single
known caller to contact a single known receiver, the receiver does not specify an intent filter, and the caller specifies the
receiver's class name in the Intent by calling [Link]() with the recipient's class name. The recipient receives a
Context object that refers to its own package, not to the package of the sender.
Note: If a receiver or broadcaster enforces permissions, your application might need to request permission to send or receive
messages from that object. You can request permission by using the <uses-permission> tag in the manifest.
Here is a code snippet of a sender and receiver. This example does not demonstrate registering receivers dynamically. For a
full code example, see the AlarmService class in the ApiDemos project.
[Link] [Link]
Android Howto
Setting Alarms
Android provides an AlarmManager service that will let you specify an Intent to send at a designated time. This intent is
typically used to start an application at a preset time. (Note: If you want to send a notification to a sleeping or running
application, use Handler instead.)
Displaying Alerts
There are two major kinds of alerts that you may display to the user: (1) Normal alerts are displayed in response to a user
action, such as trying to perform an action that is not allowed. (2) Out-of-band alerts, called notifications, are displayed as a
result of something happening in the background, such as the user receiving new e-mail.
Normal Alerts
Android provides a number of ways for you to show popup notifications to your user as they interact with your application.
Class Description
[Link] [Link]
Android Howto
[Link] A generic floating dialog box with a layout that you design.
A popup alert dialog with two buttons (typically OK and Cancel) that take callback handlers. See the
[Link]
section after this table for more details.
ProgressDialog A dialog box used to indicate progress of an operation with a known progress value or an
indeterminate length (setProgress(bool)). See Views > Progress Bar in ApiDemos for examples.
AlertDialog
This is a basic warning dialog box that lets you configure a message, button text, and callback. You can create one by calling
using the [Link] class, as shown here.
case BOUNCE_TO_VOICEMAIL:
voicemail([Link]);
break;
}
}
};
// "Answer" callback.
Message acceptMsg = [Link]();
[Link] = mHandler;
[Link] = ACCEPT_CALL;
[Link] = [Link]();
// "Cancel" callback.
final Message rejectMsg = [Link]();
[Link] = mHandler;
[Link] = BOUNCE_TO_VOICEMAIL;
[Link] = [Link]();
new [Link](this)
.setMessage("Phyllis is calling")
.setPositiveButton("Answer", acceptMsg)
.setOnCanceListener(new OnCancelListener() {
public void onCancel(DialogInterface dialog) {
[Link]();
}});
.show();
}
Notifications
Out-of-band alerts should always be displayed using the NotificationManager, which allows you to tell the user about
[Link] [Link]
Android Howto
something they may be interested in without disrupting what they are currently doing. A notification can be anything from a
brief pop-up box informing the user of the new information, through displaying a persistent icon in the status bar, to vibrating,
playing sounds, or flashing lights to get the user's attention. In all cases, the user must explicitly shift their focus to the
notification before they can interact with it.
The following code demonstrates using NotificationManager to display a basic text popup when a new SMS message arrives
in a listening service, and provides the current message count. You can see several more examples in the ApiDemos
application, under app/ (named notification*.java).
To display a notification in the status bar and have it launch an intent when the user selects it (such as the new text message
notification does), call [Link](), and pass in vibration patterns, status bar icons, or Intents to associate with
the notification.
You can also use the ProgressDialog class, which enables a dialog box with an embedded progress bar to send a "I'm
working on it" notification to the user.
An application receives a callback at startup time to enable it to populate its menu. Additionally, it receives callbacks each time
the user displays the options menu to let you perform some contextual modifications on the menu. To populate the menu on
startup, override [Link]; to populate it when the menu is called (somewhat less efficient), you can
override [Link](). Each Activity has its own menu list.
Menu items are displayed in the order added, though you can group them as described in the [Link] documentation. The
following code snippet adds three items to the default menu options and handles them through the overridden
[Link]() method. You can show or hide menu items by calling setVisible() or setGroupVisible().
[Link] [Link]
Android Howto
// Activity callback that lets your handle the selection in the class.
// Return true to indicate that you've got it, false to indicate
// that it should be handled by a declared handler object for that
// item (handler objects are discouraged for reasons of efficiency).
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch ([Link]()) {
case 0:
showAlert("Menu Item Clicked", "Zoom", "ok", null, false, null);
return true;
case 1:
showAlert("Menu Item Clicked", "Settings", "ok", null, false, null);
return true;
case 2:
showAlert("Menu Item Clicked", "Other", "ok", null, false, null);
return true;
}
return false;
}
You can add key shortcuts by calling the [Link]() or [Link]() methods, as
demonstrated here to add a "c" shortcut to a menu item:
[Link]('c');
Adding Submenus
Add a submenu by calling [Link](), which returns a SubMenu object. You can then add additional items to this
menu. Menus can only be one level deep, and you can customize the appearance of the submenu menu item.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
[Link](menu);
[Link] [Link]
Android Howto
You can also advertise your Activity's services so that other Activities can add your activity to their own option menu. For
example, suppose you implement a new image handling tool that shrinks an image to a smaller size and you would like to
offer this as a menu option to any other Activity that handles pictures. To do this, you would exposes your capabilities inside
an intent filter in your manifest. If another application that handles photos asks Android for any Activities that can perform
actions on pictures, Android will perform intent resolution, find your Activity, and add it to the other Activity's options menu.
Here's an example of a snip of a manifest that advertises picture shrinking technology for both selected items and the whole
screen.
Here's a code snippet demonstrating how a picture application would search for additional services to display on its menu.
// Search for, and populate the menu with, acceptable offering applications.
[Link](
0, // Group
0, // Any unique IDs we might care to add.
[Link](), // Name of the class displaying the menu--here, its this class.
null, // No specifics.
intent, // Previously created intent that describes our requirements.
0, // No flags.
null); // No specifics.
return true;
}
[Link] [Link]
Android Howto
Binding to Data
You can bind a ListView to a set of underlying data by using a shim class called ListAdapter (or a subclass). ListAdapter
subclasses bind to a variety of data sources, and expose a common set of methods such as getItem() and getView(), and
uses them to pick View items to display in its list. You can extend ListAdapter and override getView() to create your own
custom list items. There are essentially only two steps you need to perform to bind to data:
1. Create a ListAdapter object and specify its data source
2. Give the ListAdapter to your ListView object.
That's it!
Here's an example of binding a ListActivity screen to the results from a cursor query. (Note that the setListAdapter() method
shown is a convenience method that gets the page's ListView object and calls setAdapter() on it.)
// Create the ListAdapter. A SimpleCursorAdapter lets you specify two interesting things:
// an XML template for your list item, and
// The column to map to a specific item, by ID, in your template.
ListAdapter adapter = new SimpleCursorAdapter(this,
[Link].simple_list_item_1, // Use a template that displays a text view
c, // Give the cursor to the list adapter
new String[] {[Link]} , // Map the NAME column in the people database to...
new String[] {"text1"}); // The "text1" view defined in the XML template
setListAdapter(adapter);
See view/List4 in the ApiDemos project for an example of extending ListAdapter for a new data type.
[ . . . ]
// Need handler for callbacks to the UI thread
final Handler mHandler = new Handler();
[Link] [Link]
Android Howto
updateResultsInUi();
}
};
@Override
protected void onCreate(Bundle icicle) {
[Link](icicle);
[ . . . ]
}
// Fire off a thread to do some work that we shouldn't do directly in the UI thread
Thread t = new Thread() {
public void run() {
mResults = doSomethingExpensive();
[Link](mUpdateResults);
}
};
[Link]();
}
// Back in the UI thread -- update our UI elements based on the data in mResults
[ . . . ]
}
}
For further discussions on this topic, see Developing Responsive Applications and the Handler documentation.
To style text on the fly, you must make sure the TextView is using Spannable storage for the text (this will always be true if
the TextView is an EditText), retrieve its text with getText(), and call setSpan(Object, int, int, int), passing in a new style class
from the [Link] package and the selection range.
The following code snippet demonstrates creating a string with a highlighted section, italic section, and bold section, and
adding it to an EditText object.
[Link] [Link]
Android Howto
This context information is used to center the search result in a particular area, and is equivalent to adjusting the Map activity
to the described location and zoom level before issuing the query.
If the latitudeSpan, longitudeSpan, and zoomLevel attributes are not consistent, then it is undefined which one takes
precedence.
MyApp/
[Link] (required) Advertises the screens that this application provides, where they
can be launched (from the main program menu or elsewhere), any content
providers it implements and what kind of data they handle, where the
implementation classes are, and other application-wide information. Syntax
details for this file are described in [Link].
src/ (required) This folder holds all the source code files for your application, inside
/myPackagePath/.../[Link] the appropriate package subfolders.
res/ (required) This folder holds all the resources for your application. Resources
are external data files or description files that are compiled into your code at
build time. Files in different folders are compiled differently, so you must put
the proper resource into the proper folder. (See Resources for details.)
anim/ (optional) Holds any animation XML description files that the application uses.
[Link] The format of these files is described in Resources.
...
layout/ (optional) Holds all the XML files describing screens or parts of screens.
[Link] [Link]
Android Howto
screen_1_layout.xml Although you could create a screen in Java, defining them in XML files is
... typically easier. A layout file is similar in concept to an HTML file that
describes the screen layout and components. See Implementing a UI for more
information about designing screens, and Layout Resources for the syntax of
these files.
values/
(optional) XML files describing additional resources such as strings, colors,
arrays
and styles. The naming, quantity, and number of these files are not enforced--
[Link] any XML file is compiled, but these are the standard names given to these
[Link] files. However, the syntax of these files is prescribed by Android, and
[Link] described in Resources.
[Link]
[Link]
[Link]
xml/ (optional) XML files that can be read at run time on the device.
Note: If you are running Eclipse and encounter a warning about the VM debug port when opening DDMS, you can ignore it
if you're only interested in logs. However, if you want to further inspect and control your processes from DDMS, then you
should close Eclipse before launching DDMS so that it may use the VM debugging port.
[Link] [Link]
Troubleshooting
Android
Troubleshooting
Here are some tips and tricks for common Android errors. Don't forget to use the ddms logcat capability to get a deeper view
when errors occur. See Debugging an Android Application for more debugging tips.
ADT Installation Error: "requires plug-in [Link]".
ADB reports "no device" when an emulator is running
My new application/activity isn't showing up in the device application list
I updated my app, but the updates don't seem to be showing up on the device
I'm getting a "Binary XML file line #2: You must supply a layout_wilih attribute" error when I start an application
My request to (make a call, catch an incoming SMS, receive a notification, send an intent to an Android application) is
being ignored
Help! My project won't build in Eclipse
Eclipse isn't talking to the emulator
When I go to preferences in Eclipse and select "Android", I get the following error message: Unsupported [Link]
version 49.0.
I can't install ApiDemos apps in my IDE because of a signing error
I can't compile my app because the build tools generated an expired debug certificate
I can't run a JUnit test class in Eclipse/ADT
[Link] [Link]
Troubleshooting
Did you send your .apk file to the device (adb install)?
Run logcat on your device ( adb logcat ) and then install your .apk file. Check the logcat output to see whether the
application is being installed and recognized properly. Here's sample output from a successful installation:
If logcat shows that the package manager is having problems loading the manifest file, force your manifest to be
recompiled by adding a space in the file and compiling it.
I updated my app, but the updates don't seem to be showing up on the device
Did you remember to send your .apk file to the device (adb install)?
I'm getting a "Binary XML file line #2: You must supply a layout_wilih attribute" error
when I start an application (but I declare a layout_wilih attribute right there!!!)
Make sure that the SDK you are building with is the same version as the Android OS that you are running on.
Make sure that you're calling setContentView() early in your onCreate() method. Calling other methods, such as
setListAdapter() before calling setContentView() can sometimes create odd errors when Android tries to access screen
elements that haven't been set before.
If the above still doesn't work, you can try these steps:
1. Check the console and problems tabs at the bottom of the Eclipse UI
2. If there are problems listed in either place, they should give you a clue what is wrong
3. If you aren't sure if the problems are fresh or stale, clear the console with a right click > Clear, then clean the project
4. To clean the project (a good idea with any kind of build error), select Project > Clean from the eclipse main menu,
then select the project you are working on (or clean all)
[Link] [Link]
Troubleshooting
When communication doesn't seem to be happening between Eclipse and the emulator, symptoms can include: nothing
happening when you press run, the emulator hanging waiting for a debugger to connect, or errors that Eclipse reports about
not being able to find the emulator or shell. By far the most common symptom is that when you press run, the emulator
starts (or is already running), but the application doesn't start.
You may find any of these steps will fix the problem and with practice you probably can figure out which one you need to do
for your particular issue, but to start with, the safest option is to run through all of them in order:
1. Quit the emulator if it is running
2. Check that any emulator processes are killed (sometimes they can hang, use ps on unix or mac, or task manager in
the process view on windows).
3. Quit Eclipse
4. From the command line, type:
adb kill-server
When I go to preferences in Eclipse and select "Android", I get the following error
message: Unsupported [Link] version 49.0.
This error is displayed if you are using an older version of the JDK. Please make sure you are using JDK version 5 or 6.
The error occurs because, in this case, you are attempting to install another copy of ApiDemos onto the emulator, a copy
that is signed with a different certificate (the Android IDE tools will have signed the app with a debug certificate, where the
existing version was already signed with a private certificate). The system does not allow this type of reinstallation.
To resolve the issue, you need to fully uninstall the preinstalled and then reinstall it using the adb tool. Here's how to do
that:
1. In a terminal, change to the tools directory of the SDK.
2. If no emulator instance is running, start an emulator using using the command emulator & .
3. Uninstall the preinstalled app using the command adb uninstall [Link] .
4. Reinstall the app using the command adb install <path to the [Link]>. If you are working in Eclipse/ADT,
you can just compile and run the app in the normal way.
Note that if multiple emulator instances are running, you need to direct your uninstall/install commands to the emulator
instance that you are targeting. To do that you can add the -s <serialNumber> to the command, for example:
For more information about adb, see the Android Debug Bridge documentation.
[Link] [Link]
Troubleshooting
I can't compile my app because the build tools generated an expired debug certificate
If your development machine uses a locale that has a non-Gregorian calendar, you may encounter problems when first
trying to compile and run your application. Specifically, you may find that the Android build tools won't compile your
application because the debug key is expired.
The problem occurs because the Keytool utility — included in the JDK and used by the Android build tools — fails to
properly handle non-Gregorian locales and may create validity dates that are in the past. That is, it may generate a debug
key that is already expired, which results in the compile error.
If you encounter this problem, follow these steps to work around it:
1. First, delete the debug keystore/key already generated by the Android build tools. Specifically, delete the
[Link] file. On Linux/Mac OSX, the file is stored in ~/.android . On Windows XP, the file is stored in
C:\Documents and Settings\<user>\Local Settings\Application Data\Android . On Windows Vista, the file is
stored in C:\Users\<user>\AppData\Local\Android
2. Next, you can either
Temporarily change your development machine's locale (date and time) to one that uses a Gregorian calendar,
for example, United States. Once the locale is changed, use the Android build tools to compile and install your
app. The build tools will regenerate a new keystore and debug key with valid dates. Once the new debug key is
generated, you can reset your development machine to the original locale.
Alternatively, if you do not want to change your machine's locale settings, you can generate the keystore/key on
any machine using the Gregorian calendar, then copy the [Link] file from that computer to the proper
location on your development machine.
This problem has been verified on Windows and may apply to other platforms.
For general information about signing Android applications, see Signing Your Applications.
This error occurs because [Link] does not include complete Junit.* class implementations, but includes stub classes
only.
When configured in this way, your JUnit test class should now run properly.
[Link] [Link]
Troubleshooting
[Link] [Link]
Open Source Licensing Questions
Android
When will we see more code released under open source licenses?
Over time, more of the code that makes up Android will be released, but at this point, we have been concentrating on
shipping an SDK that helps application developers get started. In short: Stay tuned.
Why are you releasing the code under the Apache License instead of GPLv2?
One of the best explanations for the reasoning behind releasing code under Apache2 can be found in a ArsTechnica article
by Ryan Paul.
[Link] [Link]
Android Application Framework
Android
Non-Persistent Objects
For sharing complex non-persistent user-defined objects for short duration, the following approaches are recommended:
[Link] [Link]
Android Application Framework
another activity, it simply puts the object in the map and sends the key (which is a unique Long based on a counter or time
stamp) to the recipient activity via intent extras. The recipient activity retrieves the object using this key.
A Singleton class
There are advantages to using a static Singleton, such as you can refer to them without casting getApplication() to an
application-specific class, or going to the trouble of hanging an interface on all your Application subclasses so that your
various modules can refer to that interface instead.
But, the life cycle of a static is not well under your control; so to abide by the life-cycle model, the application class should
initiate and tear down these static objects in the onCreate() and onTerminate() methods of the Application Class
Persistent Objects
Even while an application appears to continue running, the system may choose to kill its process and restart it later. If you
have data that you need to persist from one activity invocation to the next, you need to represent that data as state that gets
saved by an activity when it is informed that it might go away.
For sharing complex persistent user-defined objects, the following approaches are recommended:
Application Preferences
Files
contentProviders
SQLite DB
If the shared data needs to be retained across points where the application process can be killed, then place that data in
persistent storage like Application Preferences, SQLite DB, Files or ContentProviders. Please refer to the Storing, Retrieving
and Exposing Data for further details on how to use these components.
If an Activity starts a remote service, is there any way for the Service to pass a message
back to the Activity?
The remote service can define a callback interface and register it with the clients to callback into the clients. The
RemoteCallbackList provides methods to register and unregister clients with the service, and send and receive messages.
[Link] [Link]
Android Application Framework
Here PackageReceiver is a BroadcastReceiver [Link] onReceive() method is invoked, every time an application package is
installed or removed.
[Link] [Link]
Security
Android
Security
I think I found a security flaw. How do I report it?
How can I stay informed of Android security announcements?
How do I securely use my Android phone?
I think I found malicious software being distributed for Android. How can I help?
How will Android-powered devices receive security fixes?
Can I get a fix directly from the Android Platform Project?
Is Android secure?
The security and privacy of our users' data is of primary importance to the Android Open Source Project. We are dedicated to
building and maintaining one of the most secure mobile platforms available while still fulfilling our goal of opening the mobile
device space to innovation and competition.
The Android Platform provides a rich security model that allows developers to request the capabilities, or access, needed by
their application and to define new capabilities that other applications can request. The Android user can choose to grant or
deny an application's request for certain capabilities on the handset.
We have made great efforts to secure the Android platform, but it is inevitable that security bugs will be found in any system
of this complexity. Therefore, the Android team works hard to find new bugs internally and responds quickly and professionally
to vulnerability reports from external researchers.
We appreciate researchers practicing responsible disclosure by emailing us with a detailed summary of the issue and keeping
the issue confidential while users are at risk. In return, we will make sure to keep the researcher informed of our progress in
issuing a fix and will properly credit the reporter(s) when we announce the patch. We will always move swiftly to mitigate or fix
an externally-reported flaw and will publicly announce the fix once patches are available to users.
For more general discussion of Android platform security, or how to use security features in your Android application, please
subscribe to android-security-discuss.
Despite the security protections in Android, it is important for users to only download and install software from developers they
[Link] [Link]
Security
trust. More details on how Android users can make smart security decisions will be released when consumer devices become
available.
I think I found malicious software being distributed for Android. How can I help?
Like any other open platform, it will be possible for unethical developers to create malicious software, known as malware, for
Android. If you think somebody is trying to spread malware, please let us know at security@[Link]. Please include as
much detail about the application as possible, with the location it is being distributed from and why you suspect it of being
malicious software.
The term malicious software is subjective, and we cannot make an exhaustive definition. Some examples of what the Android
Security Team believes to be malicious software is any application that:
drains the device's battery very quickly;
shows the user unsolicited messages (especially messages urging the user to buy something);
resists (or attempts to resist) the user's effort to uninstall it;
attempts to automatically spread itself to other devices;
hides its files and/or processes;
discloses the user's private information to a third party, without the user's knowledge and consent;
destroys the user's data (or the device itself) without the user's knowledge and consent;
impersonates the user (such as by sending email or buying things from a web store) without the user's knowledge and
consent; or
otherwise degrades the user's experience with the device.
When Android-powered devices are publicly available, this FAQ will provide links how Open Handset Alliance members
release updates.
In addition, We will add security fixes to the open source distribution of Android and publicly announce the changes on
android-security-announce.
If you are making an Android-powered device and would like to know how you can properly support your customers by
keeping abreast of software updates, please contact us at info@[Link].
[Link] [Link]
Security
[Link] [Link]